/**
 * 数据生成工具
 * 用于生成测试数据和模拟数据
 */

export interface DataSource {
  id: number
  name: string
  age: number
  address: string
}

export interface SearchConditions {
  selectValue?: string
  page?: number
  page_size?: number
}

export interface DataSourceResponse {
  dataSource: DataSource[]
  total: number
  page: number
  page_size: number
}

// 字母常量
const ALPHABET = 'abcdefghijklmnopqrstuvwxyz'.split('')

// 缓存生成的数据
let cachedData: DataSource[] = []

/**
 * 生成随机名称
 * @param length 名称长度
 * @returns 随机名称字符串
 */
const generateRandomName = (length: number = 5): string => {
  let name = ''
  for (let i = 0; i < length; i++) {
    const randomIndex = Math.floor(Math.random() * ALPHABET.length)
    name += ALPHABET[randomIndex]
  }
  return name
}

/**
 * 生成基础数据（100条记录）
 * @returns 用户数据数组
 */
const generateBaseData = (): DataSource[] => {
  if (cachedData.length > 0) return cachedData

  const data: DataSource[] = []
  for (let index = 1; index <= 100; index++) {
    const name = generateRandomName(5)
    const address = `西湖区湖底公园${index}号`
    const age = Math.floor(Math.random() * 50) + 18 // 18-67岁

    data.push({
      id: index,
      name,
      age,
      address,
    })
  }
  
  cachedData = data
  return data
}

/**
 * 根据搜索条件过滤数据
 * @param data 原始数据
 * @param selectValue 搜索值
 * @returns 过滤后的数据
 */
const filterData = (data: DataSource[], selectValue?: string): DataSource[] => {
  if (!selectValue) return data
  
  const searchTerm = selectValue.toLowerCase()
  return data.filter((item) => item.name.includes(searchTerm))
}

/**
 * 对数据进行分页处理
 * @param data 数据数组
 * @param page 页码
 * @param pageSize 每页大小
 * @returns 分页后的数据
 */
const paginateData = (data: DataSource[], page: number, pageSize: number) => {
  const startIndex = (page - 1) * pageSize
  const endIndex = startIndex + pageSize
  return data.slice(startIndex, endIndex)
}

/**
 * 生成用户数据（支持搜索和分页）
 * @param params 搜索条件
 * @returns Promise<DataSourceResponse>
 */
export const generateUserData = async (params: SearchConditions): Promise<DataSourceResponse> => {
  const { selectValue, page = 1, page_size = 10 } = params

  // 模拟异步请求延迟
  await new Promise(resolve => setTimeout(resolve, 300))

  try {
    // 获取基础数据
    const allData = generateBaseData()
    
    // 过滤数据
    const filteredData = filterData(allData, selectValue)
    
    // 分页处理
    const paginatedData = paginateData(filteredData, page, page_size)

    return {
      dataSource: paginatedData,
      total: filteredData.length,
      page,
      page_size,
    }
  } catch (error) {
    console.error('生成用户数据失败:', error)
    throw new Error('数据生成失败')
  }
}

/**
 * 清除缓存数据
 */
export const clearCachedData = (): void => {
  cachedData = []
}
